﻿
/*****版权***************************************************************

版权：  唧唧复唧唧木兰当户织
作者：  唧唧复唧唧木兰当户织
日期：  2020-10-28
描述：  禁止删除下面的木兰诗,
        博客 https://www.cnblogs.com/tlmbem/ ,
        源码地址 https://gitee.com/tlmbem/hml ,
        授权使用在 https://gitee.com/tlmbem/hml 上有介绍。
	
              	木兰诗
              	
        唧唧复唧唧，木兰当户织。
        不闻机杼声，唯闻女叹息。 
        问女何所思，问女何所忆。
        女亦无所思，女亦无所忆。
        昨夜见军帖，可汗大点兵，
        军书十二卷，卷卷有爷名。
        阿爷无大儿，木兰无长兄，
        愿为市鞍马，从此替爷征。 
        东市买骏马，西市买鞍鞯，
        南市买辔头，北市买长鞭。
        旦辞爷娘去，暮宿黄河边，
        不闻爷娘唤女声，但闻黄河流水鸣溅溅。
        旦辞黄河去，暮至黑山头，
        不闻爷娘唤女声，但闻燕山胡骑鸣啾啾。 
        万里赴戎机，关山度若飞。
        朔气传金柝，寒光照铁衣。
        将军百战死，壮士十年归。 
        归来见天子，天子坐明堂。
        策勋十二转，赏赐百千强。
        可汗问所欲，木兰不用尚书郎，
        愿驰千里足，送儿还故乡。
        爷娘闻女来，出郭相扶将；
        阿姊闻妹来，当户理红妆；
        小弟闻姊来，磨刀霍霍向猪羊。
        开我东阁门，坐我西阁床，
        脱我战时袍，著我旧时裳。
        当窗理云鬓，对镜帖花黄。
        出门看火伴，火伴皆惊忙，
        同行十二年，不知木兰是女郎。 
        
*********************************************************************/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Linq;
using System.Text;
using WcleAnimationLibrary;

namespace WinformControlLibraryExtension
{
    /// <summary>
    /// 动画定时器组件
    /// </summary>
    [Category("动画定时器组件")]
    [DefaultProperty("Options")]
    [DefaultEvent("Animationing")]
    public class AnimationComponent : Component
    {
        #region 新增事件

        /// <summary>
        /// 动画开始前事件
        /// </summary>
        [Description("动画开始前事件")]
        public event AnimationTimer.AnimationEventHandler AnimationStart
        {
            add { this.AnimationTimerObject.AnimationStart += value; }
            remove { this.AnimationTimerObject.AnimationStart -= value; }
        }

        /// <summary>
        /// 动画时间间隔发生事件
        /// </summary>
        [Description("动画时间间隔发生事件")]
        public event AnimationTimer.AnimationEventHandler Animationing
        {
            add { this.AnimationTimerObject.Animationing += value; }
            remove { this.AnimationTimerObject.Animationing -= value; }
        }

        /// <summary>
        /// 动画结束时事件
        /// </summary>
        [Description("动画结束时事件")]
        public event AnimationTimer.AnimationEventHandler AnimationEnding
        {
            add { this.AnimationTimerObject.AnimationEnding += value; }
            remove { this.AnimationTimerObject.AnimationEnding -= value; }
        }

        /// <summary>
        /// 动画重复间隔时事件
        /// </summary>
        [Description("动画重复间隔时事件")]
        public event AnimationTimer.AnimationEventHandler AnimationRepetition
        {
            add { this.AnimationTimerObject.AnimationRepetition += value; }
            remove { this.AnimationTimerObject.AnimationRepetition -= value; }
        }

        #endregion

        #region 新增属性

        /// <summary>
        /// 动画类型(默认值EaseIn)
        /// </summary>
        [DefaultValue(AnimationTypes.EaseIn)]
        [Description("动画类型")]
        public AnimationTypes AnimationType
        {
            get { return this.AnimationTimerObject.AnimationType; }
            set { this.AnimationTimerObject.AnimationType = value; }
        }

        /// <summary>
        /// 动画所属控件
        /// </summary>
        [DefaultValue(null)]
        [Description("动画所属控件")]
        public System.Windows.Forms.Control Control
        {
            get { return this.AnimationTimerObject.Control; }
            set { this.AnimationTimerObject.Control = value; }
        }

        /// <summary>
        /// 动画设置参数
        /// </summary>
        [Description("动画设置参数")]
        public AnimationOptions Options
        {
            get
            {
                if (this.AnimationTimerObject.Options == null)
                    this.AnimationTimerObject.Options = new AnimationOptions();

                return this.AnimationTimerObject.Options;
            }
            set { this.AnimationTimerObject.Options = value; }
        }

        /// <summary>
        /// 动画定时器时间间隔(默认值20毫秒)
        /// </summary>
        [DefaultValue(20)]
        [Description("动画定时器时间间隔")]
        public int Interval
        {
            get { return this.AnimationTimerObject.Interval; }
            set
            {
                if (this.AnimationTimerObject.Interval == value)
                    return;
                this.AnimationTimerObject.Interval = value;
            }
        }

        private AnimationTimer animationTimerObject = null;
        /// <summary>
        /// 动画播放定时器
        /// </summary>
        [Browsable(false)]
        public AnimationTimer AnimationTimerObject
        {
            get
            {
                if (this.animationTimerObject == null)
                    this.animationTimerObject = new AnimationTimer();
                return this.animationTimerObject;
            }
            set
            {
                if (this.animationTimerObject == value)
                    return;
                this.animationTimerObject = value;
            }
        }

        #endregion

        #region 重写属性

        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        protected new bool DesignMode
        {
            get
            {
                if (this.GetService(typeof(IDesignerHost)) != null || System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
                {
                    return true;   //界面设计模式
                }
                else
                {
                    return false;//运行时模式
                }
            }
        }

        #endregion

        public AnimationComponent(IContainer container)
        {
            if (container == null)
                throw new ArgumentNullException("container");
            container.Add(this);

        }

        #region 重写

        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源，为 true；否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (this.AnimationTimerObject != null)
                    this.AnimationTimerObject.Dispose();
            }
            base.Dispose(disposing);
        }

        #endregion

        #region 公开方法

        /// <summary>
        /// 动画开始
        /// </summary>
        /// <param name="_intervalTypes">添加还是减少动画时间间隔(决定动画方向)</param>
        /// <param name="_usedTime">动画已经使用了多少时间(默认值0.0毫秒)</param>
        public void Start(AnimationIntervalTypes _intervalTypes, double _usedTime)
        {
            if (this.DesignMode)
                return;

            if (this.AnimationTimerObject == null)
                return;

            this.AnimationTimerObject.Start(_intervalTypes, _usedTime);
        }

        /// <summary>
        /// 动画停止
        /// </summary>
        public void Stop()
        {
            if (this.DesignMode)
                return;

            if (this.AnimationTimerObject == null)
                return;

            this.AnimationTimerObject.Stop();
        }

        /// <summary>
        /// 暂停
        /// </summary>
        public void Suspend()
        {
            if (this.DesignMode)
                return;

            if (this.AnimationTimerObject == null)
                return;

            this.AnimationTimerObject.Suspend();
        }

        /// <summary>
        /// 继续
        /// </summary>
        public void Continue()
        {
            if (this.DesignMode)
                return;

            if (this.AnimationTimerObject == null)
                return;

            this.AnimationTimerObject.Continue();
        }

        /// <summary>
        /// 获取动画的进度（0.0-1.0）
        /// </summary>
        /// <param name="_animationType">动画类型</param>
        /// <param name="_options">动画参数</param>
        /// <param name="_usedTime">动画已经使用了多少时间</param>
        /// <returns></returns>
        public double GetProgress(AnimationTypes _animationType, AnimationOptions _options, double _usedTime)
        {
            if (this.DesignMode)
                throw new ArgumentNullException("设计模式不允许使用该方法");

            if (this.AnimationTimerObject == null)
                throw new ArgumentNullException("container");

            return  AnimationTimer.GetProgress(_animationType, _options, _usedTime);
        }

        #endregion
    }
}
